/*
 * Copyright (c) 2024 Huawei Technologies Co., Ltd.
 * openUBMC is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *         http://license.coscl.org.cn/MulanPSL2
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

#ifndef MC_MCTP_PCIeEndpoint_H
#define MC_MCTP_PCIeEndpoint_H

#include <mc/engine.h>

template <typename T>
using property = mc::engine::property<T>;

namespace mctp_test {

class PCIeEndpoint : public mc::engine::interface<PCIeEndpoint> {
public:
    MC_INTERFACE("bmc.kepler.Systems.Mctp.PCIeEndpoint")
    PCIeEndpoint()  = default;
    ~PCIeEndpoint() = default;

    property<uint8_t>     MessageType;
    property<std::string> ServiceName;
    property<uint8_t>     Status;
    property<uint8_t>     TargetEid;
    property<uint8_t>     TargetPhyAddr;

    std::vector<uint8_t>
         request(const std::map<std::string, std::string>& context, // a{ss} - 请求体上下文
                 const std::vector<uint8_t>&               data,    // ay - 请求数据
                 int32_t                                   timeout, // i - 超时时间
                 const std::map<std::string, std::string>&
                     ReqHeaderFileds, // a{ss} - mctp上层协议请求报文头字段,
                                      // 完成协议请求报文头的填充。目前支持, NCSI协议: 数据包类型
                                      // PacketType, 通道标识 ChannelId, 数据包标识 PackageId; NVME协议:
                                      // 数据完整校验标识 IC, NVME消息类型 MsgType, 命令插槽标识 CmdSlot;
                                      // PLDM协议: 报文类型 PldmType, 命令代码 CommandCode
                 const std::map<std::string, std::string>&
                     RspHeaderValidators // a{ss} - 对mctp上层协议返回报文头的校验。支持校验项: NCSI:
                                         // NCSI协议返回数据包类型 PacketType; PLDM协议: 返回命令代码
                                         // CommandCode
         );
    void send(const std::map<std::string, std::string>& context, // a{ss} - 请求体上下文
              const std::vector<uint8_t>&               data,    // ay - 请求数据
              const std::map<std::string, std::string>&
                  ReqHeaderFileds // a{ss} - mctp上层协议请求报文头字段,
                                  // 完成协议请求报文头的填充。目前支持, NCSI协议: 数据包类型
                                  // PacketType, 通道标识 ChannelId, 数据包标识 PackageId; NVME协议:
                                  // 数据完整校验标识 IC, NVME消息类型 MsgType, 命令插槽标识
                                  // CmdSlot; PLDM协议: 报文类型 PldmType, 命令代码 CommandCode
    );
};

} // namespace mctp_test

#endif // MC_MCTP_PCIeEndpoint_H